/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto;

/**
 *
 * @author Luis Romero
 */
public class CacheDatos {

    MemoriaPrincipal memoriaP;

    private class bloque {

        public int palabra0;
        public int palabra1;

        public bloque() {
            palabra0 = 0;
            palabra0 = 0;
        }

        public int getPalabra0() {
            return palabra0;
        }

        public int getPalabra1() {
            return palabra1;
        }

        public void setPalabra0(int palabra0) {
            this.palabra0 = palabra0;
        }

        public void setPalabra1(int palabra1) {
            this.palabra1 = palabra1;
        }

        public void setBloque(int palabra0, int palabra1) {
            this.palabra0 = palabra0;
            this.palabra1 = palabra1;
        }
    }
    private bloque cache[];
    private int etiqueta[];
    private int bitV[];

    public CacheDatos() {
        cache = new bloque[4];
        etiqueta = new int[4];
        bitV = new int[4];

    }

    public void setMemoria(MemoriaPrincipal mp) {
        memoriaP = mp;
    }

    public void setMemoriaPrincipal(MemoriaPrincipal memoriaP) {
        this.memoriaP = memoriaP;
    }

    public void setDato(int palabra, int etiq, int pos, int bitP) {
        if (bitP == 0 && etiqueta[pos] == etiq) {
            cache[pos].setPalabra0(palabra);
            memoriaP.guardarDato(palabra, etiq,bitP);
            bitV[pos] = 1;
            //Invalidar otros cache aqui
        } else if (bitP == 1 && etiqueta[pos] == etiq) {
            cache[pos].setPalabra1(palabra);
            memoriaP.guardarDato(palabra, etiq,bitP);
            bitV[pos] = 1;
            //Invalidar otros cache aqui
        } else {
            memoriaP.guardarDato(palabra, etiq,bitP);
        }
        //etiqueta[pos] = etiq;
        //bitV[pos] = 1;
    }

    public int getDato(int etiq, int pos, int bitP) {
        if (etiqueta[pos] == etiq && bitV[pos] == 1) {
            if (bitP == 0) {
                return cache[pos].getPalabra0();
            } else {
                return cache[pos].getPalabra1();
            }
        } else {
            //llamado a memoria con etiq para devolver bloque
            //setPalabra0/1 para guardar bloque en posicion
            //guarda ambas palabras
            if (bitP == 0) {
                setDato(memoriaP.cargarDato(etiq, bitP), etiq, pos, bitP);
                return memoriaP.cargarDato(etiq, bitP);
                //return palabra0
            } else {
                setDato(memoriaP.cargarDato(etiq, bitP), etiq, pos, bitP);
                return memoriaP.cargarDato(etiq, bitP);
                //return palabra1
            }
        }
    }

    public void invalidarBloque(int etiq, int pos) {
        if (etiqueta[pos] == etiq) {
            bitV[pos] = 0;
        }
    }

    public void validarBloque(int etiq, int pos) {
        if (etiqueta[pos] == etiq) {
            bitV[pos] = 1;
        }
    }
}
